package jmine.tec.hydra.api;

import java.io.InputStream;
import java.util.Map;

import jmine.tec.hydra.domain.HydraSystem;

/**
 * Interface de serviços do Hydra.
 * 
 * @author marco.vieira
 */
public interface Hydra {

    /**
     * Envia mensagens de acordo com a ativação passada. Lança HydraException caso ocorra algum erro durante o envio.
     * 
     * @param source o conteudo da mensagem.
     * @param activation a ativação que irá gerar a ação de integração a partir do conteudo (source) passado.
     * @return request resultante
     */
    HydraRequest send(Object source, String activation);

    /**
     * Envia mensagens de acordo com a especificação passada. Lança HydraException caso ocorra algum erro durante o envio.
     * 
     * @param source o conteudo da mensagem.
     * @param specification a especificação.
     * @return request resultante.
     */
    HydraRequest send(Object source, HydraSpecification specification);

    /**
     * Trata o recebimento de uma mensagem.
     * 
     * @param system sistema que enviou a mensagem.
     * @param messageInputStream stream com a mensagem recebida.
     * @param messageProperties mapa com propriedades da mensagem que serão utilizadas para seu reconhecimento.
     * @return request resultante
     */
    HydraRequest receive(HydraSystem system, InputStream messageInputStream, Map<String, String> messageProperties);
}
